package model
{{- $ClassName := .ClassName }}
{{- $EventPackage := .EventPackage}}
{{- $CommandPackage := .CommandPackage}}

import (
    "context"
    {{.time}}
    "{{.Namespace}}/pkg/cmd-service/domain/{{.aggregate_name}}/command"
    "{{.Namespace}}/pkg/cmd-service/domain/{{.aggregate_name}}/event"
    "{{.Namespace}}/pkg/cmd-service/domain/{{.aggregate_name}}/field"
    "{{.Namespace}}/pkg/cmd-service/domain/{{.aggregate_name}}/factory"
    "{{.Namespace}}/pkg/cmd-service/infrastructure/utils"
    "github.com/liuxd6825/dapr-go-ddd-sdk/ddd"
    "github.com/liuxd6825/dapr-go-ddd-sdk/metadata"
)

//
// {{.ClassName}}
// @Description:  {{.Description}} 聚合类型
//
type {{.ClassName}} struct {
{{- range $name, $property := .Properties}}
    {{- if $property.IsArrayEntityType }}
    {{$property.UpperName}} *{{$property.GoLanType}}Items `json:"{{$property.JsonName}}" copier:"-" validate:"{{$property.GetValidate}}" description:"{{$property.Description}}"` // {{$property.Description}}
    {{- else if  $property.IsArray }}
    {{$property.UpperName}} []{{$property.GoLanType}} `json:"{{$property.JsonName}}" validate:"{{$property.GetValidate}}"  description:"{{$property.Description}}"` // {{$property.Description}}
    {{- else }}
    {{$property.UpperName}} {{$property.GoLanType}} `json:"{{$property.JsonName}}" validate:"{{$property.GetValidate}}"  description:"{{$property.Description}}"` // {{$property.Description}}
    {{- end }}
{{- end}}
}

//
// {{.ClassName}}Metadata
// @Description:  {{.Description}} 元数据
//
type {{.ClassName}}Metadata struct {
{{- range $name, $property := .Properties}}
    {{$property.UpperName}} metadata.Property  `json:"-"`
{{- end}}
	Properties  metadata.Properties `json:"properties"`
}

const (
    AggregateType = "{{.AggregateType}}"
)

var (
    // MaskMapper时不复制的属性
    _aggMapperRemove []string
    // 元数据
    _{{.className}}Metadata = new{{.ClassName}}Metadata()
)


func init(){
    {{- range $name, $property := .Properties}}
    {{- if $property.IsArray}}
    _aggMapperRemove = append(_aggMapperRemove, "{{$property.UpperName}}")
    {{- end }}
    {{- end }}
}

//
// New{{.ClassName}}
// @Description: 新建{{.Description}} 聚合对象
// @return *{{.ClassName}}
//
func New{{.ClassName}}() *{{.ClassName}} {
    return &{{.ClassName}} {
    {{- range $name, $property := .Properties}}
        {{- if $property.IsArray}}
        {{$property.UpperName}} : New{{$property.LanType}}Items() ,
        {{- end}}
    {{- end}}
    }
}

//
// NewAggregate
// @Description: 新建当前包中的聚合对象，当前包中只能有一个聚合类型
// @return ddd.Aggregate
//
func NewAggregate() ddd.Aggregate {
	return New{{.ClassName}}()
}

//
// new{{.ClassName}}Metadata
// @Description: 新建{{.Description}}元数据
// @return *{{.ClassName}}Metadata
//
func new{{.ClassName}}Metadata() *{{.ClassName}}Metadata {
	v := &{{.ClassName}}{}
	m := &{{.ClassName}}Metadata{}
    if err := metadata.InitMetadata(m, v); err != nil {
        panic(err)
    }
	return m
}

//
// Get{{.ClassName}}Metadata
// @Description: 获取{{.Description}}元数据
// @return *{{.ClassName}}Metadata
//
func Get{{.ClassName}}Metadata() *{{.ClassName}}Metadata {
    return _{{.className}}Metadata
}



//
// GetAggregateVersion
// @Description: 聚合的版本号
// @receiver a
// @return string 版本号
//
func (a *{{.ClassName}}) GetAggregateVersion() string {
    return "{{.Aggregate.Version}}"
}

//
// GetAggregateType
// @Description: 获取 聚合的类型
// @receiver a
// @return string 聚合的类型
//
func (a *{{.ClassName}}) GetAggregateType() string {
    return AggregateType
}

//
// GetAggregateId
// @Description: 获取 聚合id
// @receiver a
// @return string 聚合id
//
func (a *{{.ClassName}}) GetAggregateId() string {
    return a.{{.Aggregate.Id.Name}}
}

//
// GetTenantId
// @Description: 租户id
// @receiver a
// @return string 租户id
//
func (a *{{.ClassName}}) GetTenantId() string {
    return a.TenantId
}

//
// GetProperties
// @Description: 获取属性列表
// @return metadata.Properties 属性列表
//
func (a *{{.ClassName}}) GetProperties() metadata.Properties {
	return Get{{.ClassName}}Metadata().Properties
}
